//int main()
//{
//	int m = 0;//数组a的个数
//	int n = 0;//shuzub的个数
//	int i = 0;
//	int j = 0;
//	scanf("%d%d", &m, &n);
//	int a[1000];
//	int b[1000];
//
//	//输入第一个数组
//	for (i = 0; i < m; i++)
//	{
//		scanf("%d", &a[i]);
//	}
//
//	//输入第二个数组
//	for (j = 0; j < n; j++)
//	{
//		scanf("%d", &b[j]);
//	}
//	i = 0;
//	j = 0;
//	while (i < m && j < n)
//	{
//		if (a[i] < b[j])
//		{
//			printf("%d ", a[i]);
//			i++;
//		}
//		else
//		{
//			printf("%d ", b[j]);
//			j++;
//		}
//	}
//	if (i==m)//此时数组a的值都已经打印出来了
//	{
//		for(;  j< n; j++)//数组b剩下的元素想直接打印出来就行了
//		{
//			printf("%d ", b[j]);
//		}
//	}
//
//	if (j == n)//此时数组b的值都已经打印出来了
//	{
//		for (; i < m; i++)//数组a剩下的元素想直接打印出来就行了
//		{
//			printf("%d ", a[i]);
//		}
//	}
//	return 0;
//
//}

////动态内存版
//int main()
//{
//	int m = 0;//数组a的个数
//	int n = 0;//shuzub的个数
//	int i = 0;
//	int j = 0;
//	scanf("%d%d", &m, &n);
//	
//	int *pa = (int*)malloc((m + 1) * sizeof(int));//开辟有序序列合并的数组空间
//	int *pb = (int*)malloc((n + 1) * sizeof(int));//开辟有序序列合并的数组空间
//	if (pa == NULL)
//	{
//		perror("malloc: ");
//		return;
//	}
//	if (pb == NULL)
//	{
//		perror("malloc: ");
//		return;
//	}
//	//输入第一个数组
//	for (i = 0; i < m; i++)
//	{
//		scanf("%d", pa+i);
//	}
//
//	//输入第二个数组
//	for (j = 0; j < n; j++)
//	{
//		scanf("%d", pb+j);
//	}
//	i = 0;
//	j = 0;
//	
//	while (i<m && j<n)
//	{
//		if (*(pa + i) < *(pb + j))
//		{
//			printf("%d ", *(pa + i));
//			i++;
//		}
//		else
//		{
//			printf("%d ", *(pb + j));
//			j++;
//		}
//	}
//	if (i == m)//此时数组a的值都已经打印出来了
//	{
//		for (; j < n; j++)//数组b剩下的元素想直接打印出来就行了
//		{
//			printf("%d ", *(pb + j));
//		}
//	}
//
//	if (j == n)//此时数组b的值都已经打印出来了
//	{
//		for (; i < m; i++)//数组a剩下的元素想直接打印出来就行了
//		{
//			printf("%d ", *(pa + i));
//		}
//	}
//	
//	free(pa);
//	free(pb);
//	pa = NULL;
//	pb = NULL;
//	return 0;
//}

void bubble_sort(int* arr, int sz)
{
	//排序坐外面的大循环次数
	int i = 0;
	for (i = 0; i < sz - 1; i++)
	{
		int flag = 1;//状态机标志位，代表数组本身元素就是从小到大排序的
		int j = 0;
		for (j = 0; j < sz - 1 - i; j++)
		{
			if (arr[j] > arr[j + 1])
			{
				flag = 0;//只要有一个地方需要排序，就置零
				int tmp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = tmp;
			}
		}
		if (1 == flag)
		{//第一轮排序结果都是1，说明没有地方需要排序
			break;//直接跳出后面的循环，不需要再排序了
		}
	}
}
int main()
{
	int m = 0;//数组a的个数
	int n = 0;//数组b的个数
	int i = 0;
	int j = 0;

	scanf("%d%d", &m, &n);
	int a[1000];
	int b[1000];

	//输入第一个数组
	for (i = 0; i < m; i++)
	{
		scanf("%d", &a[i]);
	}

	//输入第二个数组
	for (j = 0; j < n; j++)
	{
		scanf("%d", &b[j]);
	}
	memcpy(a+m, b, n*4);//利用了库函数
	//可以将合并后的数组打印出来看看
	//for (int i = 0; i < m+n; i++)
	//{
	//	printf("%d ", a[i]);
	//}
	
	bubble_sort(a, m+n);//冒泡排序的函数，
	i = 0;
	for (i = 0; i < m + n; i++)
	{
		printf("%d ", a[i]);
	}
	return 0;
}
